﻿#pragma once

#include <mutex>

namespace breaking
{
	/**
	 * @brief 日志滚动类型
	 */
	enum file_roll_type
	{
		FILE_ROLL_NONE,			// 不滚动
		FILE_ROLL_HOUR,			// 按小时
		FILE_ROLL_DAY,			// 按天
		FILE_ROLL_MONTH,		// 按月
	};

	/**
	 * @brief 日志追加器
	 */
	struct log_event;
	class log_appender
	{
	public:
		log_appender();
		virtual ~log_appender();

		/**
		 * @brief 打开日志追加器
		 * @return
		 */
		bool open();

		/**
		 * @brief 关闭日志追加器
		 */
		void close();

		/**
		 * @brief 追加日志
		 * @param event
		 * @return
		 */
		bool append(const log_event& event);

		/**
		 * @brief 日志滚动类型
		 * @param type
		 */
		void set_roll_type(file_roll_type type);
		size_t get_roll_type() const;

		/**
		 * @brief 单个日志文件最大大小(0代表不会根据文件大小来滚动)
		 * @param size
		 */
		void set_max_file_size(size_t size);
		size_t get_max_file_size() const;

	protected:
		virtual bool do_open() = 0;
		virtual bool do_append(const log_event& event) = 0;
		virtual void do_close() = 0;

	protected:
		// 日志滚动类型
		file_roll_type		m_roll_type;
		// 单个日志文件最大大小(0代表不会根据文件大小来滚动)
		size_t				m_max_file_size;

	private:
		// 互斥锁
		std::mutex			m_mutex;
	};
}